# 将课上模拟博客园登录的装饰器的认证的代码完善好，整清楚。

dic_status = {
    'username': None,
    'status': False
}

def get_dic_user_pwd():
	with open('register', encoding='utf-8') as f1:
		return {line.strip().split('|')[0]:line.strip().split('|')[1] for line in f1}


def login(dic_upd):
    dic = dic_upd()
    i = 0
    while i < 3:
        username = input('请输入用户名').strip()
        password = input('请输入密码').strip()
        if username in dic and password == dic[username]:
            dic_status['username'] = username
            dic_status['status'] = True
            return True
        i += 1
    return False
def auth(f):
    def inner(*args,**kwargs):
        '''要进行登陆认证：
            有两个分支：
                1，如果之前登陆成功了，直接访问。
                2，如果这是之前没有登陆过，先进行三次登陆。
        '''
        if dic_status['status']:
            ret = f(*args,**kwargs)
            return ret
        else:
            if login(get_dic_user_pwd):
                ret = f(*args, **kwargs)
                return ret
    return inner
@auth
def article():
    print('欢迎访问文章页面')

# article()
@auth
def diary():
    print('欢迎访问日记页面')


@auth
def comment():
    print('欢迎访问评论页面')


# article()
# diary()
# comment()







# 看代码写结果：
#


# def wrapper(f):  # 1,执行wrapper函数，并且将func函数名 传给 变量f
#     def inner(*args,**kwargs):
#         print(111)  # 5，打印111
#         ret = f(*args,**kwargs)  # 6，执行真正的func函数
#         print(222)  # 8, 打印222
#         return ret
#     return inner
#
# @wrapper  # func = wrapper(func)  # 2,将inner函数名给了重新定义的变量 func = inner
# def func():
#     print(333)  # 7，打印333
#
# print(444)  # 3, 打印 444
# func()  # 4，inner() 执行inner函数
# print(555)  # 9，打印555

# def func():
#     print(666)
#
# func = inner
# print(func)


'''

'''
# 编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码’。
#
# 为函数写一个装饰器，把函数的返回值 +100 然后再返回。
#
# def wrapper(f):
#     def inner(*args,**kwargs):
#         ret = f(*args,**kwargs)  # 7
#         return ret + 100
#     return inner
#
#
#
# @wrapper  # func = wrapper(func)
# def func():
#     return 7
#
# result = func()  # inner()
# print(result)
# 请实现一个装饰器，通过一次调用是函数重复执行5次。




# 请实现一个装饰器，每次调用函数时，将函数名以及调用此函数的时间节点写入文件中。
#
# 可用代码：

# import time
# struct_time = time.localtime()
# now_time = time.strftime("%Y-%m-%d %H:%M:%S",struct_time)  # 当前时间节点
#
#
# def wrapper(f):  # f = qsnb
#     def inner(*args,**kwargs):
#         with open('qsnb',encoding='utf-8',mode='a') as f1:
#             struct_time = time.localtime()
#             now_time = time.strftime("%Y-%m-%d %H:%M:%S", struct_time)
#             f1.write(f'在{now_time}执行{f.__name__}\n')
#         ret = f(*args,**kwargs)
#         return ret
#     return inner
#
# @wrapper  # qsnb = wrapper(qsnb)
# def qsnb():
#     print('确实nb')
# qsnb()  # inner()

# def func1(f):
#     print(f.__name__)
# func1(wrapper)



# 函数名通过： 函数名.__name__获取。

# def func():
#     pass
# f = func
# print(f.__name__)